Testy funkcjonalne
==================

Zanim przeczytasz ten rozdział, zaleca się abyś przeczytał najpierw
[dokumentację Selenium](http://seleniumhq.org/docs/) oraz 
[dokumentację PHPUnit](http://www.phpunit.de/wiki/Documentation).
W dalszej części streszczamy pokrótce podstawowe zasadu pisania testów funkcjonalnych 
w Yii.

 * Tak jak w testach jednostkowych, testy funkcjonalne są zapisywane jako klasy `XyzTest`,
 które dziedziczą z [CWebTestCase], gdzie `Xyz` oznacza klasę, która będzie testowana.
 Ponieważ `PHPUnit_Extensions_SeleniumTestCase` jest rodzicem dla klasy [CWebTestCase], 
 możemy używac wszystkich metod dziedziczących z tej klasy.

 * Klasa testu funkcjonalnego zachowana jest w pliku PHP o nazwie `XyzTest.php`.
 Umownie, plik testu funkcjonalnego może być zapisany w katalogu `protected/tests/functional`.

 * Klasa testująca zawiera przede wszystkim zestaw metod testujących o nazwie `testAbc`,
 gdzie `Abc` często jest nazwą funkcjonalności, którą będziemy testować. Na przykład,
 aby przetestować funkcjonalność logowania użytkownika, możemy posiadać metodę o nazwie `testLogin`.

 * Metoda testująca zazawyczaj zawiera sekwencję wyrażeń, które wydają komendy Selenium RC 
 by oddziaływało ono z aplikacją sieciową, która jest testowana. Zawiera ona również  
 wyrażenia z asercjami w celu zweryfikowania, czy aplikacja sieciowa odpowiedziała
 zgodnie z tym jak oczekiwano.

Zanim opiszemy jak napisać test funkcjonalny, popatrzmy na plik `WebTestCase.php`
wygenerowany przez komendę `yiic webapp`. Plik ten definiuje `WebTestCase`,
który może służyć jako klasa bazowa dla testów funkcjonalnych wszystkich klas.

~~~
[php]
define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/');

class WebTestCase extends CWebTestCase
{
	/**
	 * Sets up before each test method runs.
	 * This mainly sets the base URL for the test application.
	 */
	protected function setUp()
	{
		parent::setUp();
		$this->setBrowserUrl(TEST_BASE_URL);
	}

	......
}
~~~

Klasa `WebTestCase` przede wszystkim ustawia adres bazowy URL strony, która będzie 
testowana. Później, w metodach testujących, możemy używać relatywne adresy URL 
w celu określenia, która strona powinna być przetestowana.

Powinniśmy też zwrócić uwagę, na to że w adresie bazowym URL używamy `index-test.php`
jako pliku wejściowego zamiast `index.php`. Jedyna różnica pomiędzy `index-test.php` a `index.php`
to ta, że pierwsza używa `test.php` jako pliku konfiguracji aplikacji, gdy druga 
używa `main.php`.

Opiszemy teraz jak przetestować funkcjonalność wyświetlania postów w 
[demo blogu](http://www.yiiframework.com/demos/blog). Najpierw napiszemy klasę 
testującą w następujący sposób, zauważając iż klasa testowa dziedziczy z klasy
bazowej, którą przed chwilką opisaliśmy:

~~~
[php]
class PostTest extends WebTestCase
{
	public $fixtures=array(
		'posts'=>'Post',
	);

	public function testShow()
	{
		$this->open('post/1');
	    // sprawdź czy tytuł przykładowego postu istnieje
	    $this->assertTextPresent($this->posts['sample1']['title']);
	    // sprawdź czy formularz komentarza istnieje 
	    $this->assertTextPresent('Zostaw komentarz');
	}

	......
}
~~~

Tak jak pisząc klasy testów jednostkowych, tak i tutaj deklarujemy konfiguracje 
testów, które bedziemy używać podczas testowania. Tutaj wkazaliśmy, iż 
użyta będzie konfiguracja testu `Post`. W metodzie testującej `testShow`,
najpierw poinstruowaliśmy Selenium RC aby otwarło adres URL `post/1`.
Zauważ, że jest to relatywny adres URL a kompletny adres URL jest utworzony 
poprzez dołączenie do niego adresu bazowego URL, który ustawiliśmy w klasie 
bazowej (np. `http://localhost/yii/demos/blog/index-test.php/post/1`). 
Następnie weryfikujemy czy możemy znaleźć tytuł postu `sample1` na aktualnej stronie.
Sprawdzamy również, czy strona zawiera tekst `Zostaw komentarz`.


<div class="revision">$Id: test.functional.txt 1662 2010-01-04 19:15:10Z qiang.xue $</div>